GCC:優化 Linux、互聯網和一切
軟體如果不能被電腦運行,那麼它就是無用的。而在處理 運行時 性能的問題上,即使是最有才華的開發人員也會受編譯器的支配 —— 因為如果沒有可靠的編譯器工具鏈,就無法構建任何重要的東西。 GNU 編譯器集合 (GCC)提供了一個健壯、成熟和高性能的工具,以幫助你充分發揮你代碼的潛能。經過數十年成千上萬人的開發,GCC 成為了世界上最受尊敬的編譯器之一。如果你在構建應用程序是沒有使用 GCC,那麼你可能錯過了最佳解決方案。
根據 LLVM.org 的說法,GCC 是「如今事實上的標準開源編譯器」 [1] ,也是用來構建完整系統的基礎 —— 從內核開始。GCC 支持超過 60 種硬體平台,包括 ARM、Intel、AMD、IBM POWER、SPARC、HP PA-RISC 和 IBM Z,以及各種操作環境,包括 GNU、Linux、Windows、macOS、FreeBSD、NetBSD、OpenBSD、DragonFly BSD、Solaris、AIX、HP-UX 和 RTEMS。它提供了高度兼容的 C/C++ 編譯器,並支持流行的 C 庫,如 GNU C Library(glibc)、Newlib、musl 和各種 BSD 操作系統中包含的 C 庫,以及 Fortran、Ada 和 GO 語言的前端。GCC 還可以作為一個交叉編譯器,可以為運行編譯器的平台以外的其他平台創建可執行代碼。GCC 是緊密集成的 GNU 工具鏈的核心組件,由 GNU 項目產生,它包括 glibc、Binutils 和 GNU 調試器(GDB)。
「一直以來我最喜歡的 GNU 工具是 GCC,即 GNU 編譯器集合 。在開發工具非常昂貴的時候,GCC 是第二個 GNU 工具,也是使社區能夠編寫和構建所有其他工具的工具。這個工具一手改變了這個行業,導致了自由軟體運動的誕生,因為一個好的、自由的編譯器是一個社區軟體的先決條件。」—— Red Hat 開源和標準團隊的 Dave Neary。 [2]
優化 Linux
作為 Linux 內核源代碼的默認編譯器,GCC 提供了可靠、穩定的性能以及正確構建內核所需的額外擴展。GCC 是流行的 Linux 發行版的標準組件,如 ArchLinux、CentOS、Debian、Fedora、openSUSE 和 Ubuntu 這些發行版中,GCC 通常用來編譯支持系統的組件。這包括 Linux 使用的默認庫(如 libc、libm、libintl、libssh、libssl、libcrypto、libexpat、libpthread 和 ncurses),這些庫依賴於 GCC 來提供可靠性和高性能,並且使應用程序和系統程序可以訪問 Linux 內核功能。發行版中包含的許多應用程序包也是用 GCC 構建的,例如 Python、Perl、Ruby、nginx、Apache HTTP 伺服器、OpenStack、Docker 和 OpenShift。各個 Linux 發行版使用 GCC 構建的大量代碼組成了內核、庫和應用程序軟體。對於 openSUSE 發行版,幾乎 100% 的原生代碼都是由 GCC 構建的,包括 6135 個源程序包、5705 個共享庫和 38927 個可執行文件。這相當於每周編譯 24540 個源代碼包。 [3]
Linux 發行版中包含的 GCC 的基本版本用於創建定義系統 應用程序二進位介面 (ABI)的內核和庫。 用戶空間 開發者可以選擇下載 GCC 的最新穩定版本,以獲得高級功能、性能優化和可用性改進。Linux 發行版提供安裝說明或預構建的工具鏈,用於部署最新版本的 GCC 以及其他 GNU 工具,這些工具有助於提高開發人員的工作效率和縮短部署時間。
優化互聯網
GCC 是嵌入式系統中被廣泛採用的核心編譯器之一,支持為日益增長的物聯網設備開發軟體。GCC 提供了許多擴展功能,使其非常適合嵌入式系統軟體開發,包括使用編譯器的內建函數、#語法、內聯彙編和以應用程序為中心的命令行選項進行精細控制。GCC 支持廣泛的嵌入式體系結構,包括 ARM、AMCC、AVR、Blackfin、MIPS、RISC-V、Renesas Electronics V850、NXP 和 Freescale Power 處理器,可以生成高效、高質量的代碼。GCC提供的交叉編譯能力對這個社區至關重要,而預製的交叉編譯工具鏈 [4] 是一個主要需求。例如,GNU ARM 嵌入式工具鏈是經過集成和驗證的軟體包,其中包含 ARM 嵌入式 GCC 編譯器、庫和其它裸機軟體開發所需的工具。這些工具鏈可用於在 Windows、Linux 和 macOS 主機操作系統上對流行的 ARM Cortex-R 和 Cortex-M 處理器進行交叉編譯,這些處理器已裝載於數百億台支持互聯網的設備中。 [5]
GCC 為雲計算賦能,為需要直接管理計算資源的軟體提供了可靠的開發平台,如資料庫和 Web 服務引擎以及備份和安全軟體。GCC 完全兼容 C++ 11 和 C++ 14,為 C++ 17 和 C++ 2a 提供實驗支持 [6] (LCTT 譯註:本文原文發佈於 2018 年),可以創建性能優異的對象代碼,並提供可靠的調試信息。使用 GCC 的應用程序的一些例子包括:MySQL 資料庫管理系統,它需要 Linux 的 GCC [7] ;Apache HTTP 伺服器,它建議使用 GCC [8] ;Bacula,一個企業級網路備份工具,它需要 GCC。 [9]
優化一切
對於 高性能計算 (HPC)中使用的科學代碼的研究和開發,GCC 提供了成熟的 C、C++ 和 Fortran 前端,以及對 OpenMP 和 OpenACC API的支持,用於基於指令的並行編程。因為 GCC 提供了跨計算環境的可移植性,它使得代碼能夠更容易地在各種新的和傳統的客戶機和伺服器平台上進行測試。GCC 為 C、C++ 和 Fortran 編譯器提供了 OpenMP 4.0 的完整支持,為 C 和 C++ 編譯器提供了 OpenMP 4.5 完整支持。對於 OpenACC、 GCC 支持大部分 2.5 規範和性能優化,並且是唯一提供 OpenACC 支持的非商業、非學術編譯器。
代碼性能是這個社區的一個重要參數,GCC 提供了一個堅實的性能基礎。Colfax Research 於 2017 年 11 月發表的一篇論文評估了 C++ 編譯器在使用 OpenMP 4.x 指令並行化編譯代碼的速度和編譯後代碼的運行速度。圖 1 描繪了不同編譯器編譯並使用單個線程運行時計算內核的相對性能。性能值經過了歸一化處理,以 G++ 的性能為 1.0。
![performance](/data/attachment/album/202101/22/122214zthwmtvvv1zznmiv.jpg "performance")
圖 1 為由不同編譯器編譯的每個內核的相對性能。(單線程,越高越好)。
他的論文總結道:「GNU 編譯器在我們的測試中也做得很好。G++ 在六種情況中的三種情況下生成的代碼速度是第二快的,並且在編譯時間方面是最快的編譯器之一。」 [10]
誰在用 GCC?
在 JetBrains 2018 年的開發者生態狀況調查中,在接受調查的 6000 名開發者中,66% 的 C++ 程序員和 73% 的 C 程序員經常使用 GCC。 [11] 以下簡要介紹 GCC 的優點,正是這些優點使它在開發人員社區中如此受歡迎。
- 對於需要為各種新的和遺留的計算平台和操作環境編寫代碼的開發人員,GCC 提供了對最廣泛的硬體和操作環境的支持。硬體供應商提供的編譯器主要側重於對其產品的支持,而其他開源編譯器在所支持的硬體和操作系統方面則受到很大限制。 [12]
- 有各種各樣的基於 GCC 的預構建工具鏈,這對嵌入式系統開發人員特別有吸引力。這包括 GNU ARM 嵌入式工具鏈和 Bootlin 網站上提供的 138 個預編譯交叉編譯器工具鏈。 [13] 雖然其他開源編譯器(如 Clang/LLVM)可以取代現有交叉編譯工具鏈中的 GCC,但這些工具集需要開發者完全重新構建。 [14]
- GCC 通過成熟的編譯器平台嚮應用程序開發人員提供可靠、穩定的性能。《在 AMD EPYC 平台上用 GCC 8/9 與 LLVM Clang 6/7 編譯器基準測試》這篇文章提供了 49 個基準測試的結果,這些測試的編譯器在三個優化級別上運行。使用
-O3 -march=native
級別的 GCC 8.2 RC1 在 34% 的時間裡排在第一位,而在相同的優化級別 LLVM Clang 6.0 在 20% 的時間裡贏得了第二位。 [15] - GCC 為編譯調試 [16] 提供了改進的診斷方法,並為運行時調試提供了準確而有用的信息。GCC 與 GDB 緊密集成,GDB 是一個成熟且功能齊全的工具,它提供「不間斷」調試,可以在斷點處停止單個線程。
- GCC 是一個得到良好支持的平台,它有一個活躍的、有責任感的社區,支持當前版本和以前的兩個版本。由於每年都有發布計劃,這為一個版本提供了兩年的支持。
GCC:仍然在繼續優化
GCC 作為一個世界級的編譯器繼續向前發展。GCC 的最新版本是 8.2,於 2018 年 7 月發布(LCTT 譯註:本文原文發表於 2018 年),增加了對即將推出的 Intel CPU、更多 ARM CPU 的硬體支持,並提高了 AMD 的 ZEN CPU 的性能。增加了對 C17 的初步支持,同時也對 C++2A 進行了初步工作。診斷功能繼續得到增強,包括更好的發射診斷,改進了定位、定位範圍和修復提示,特別是在 C++ 前端。Red Hat 的 David Malcolm 在 2018 年 3 月撰寫的博客概述了 GCC 8 中的可用性改進。 [17]
新的硬體平台繼續依賴 GCC 工具鏈進行軟體開發,例如 RISC-V,這是一種自由開放的 ISA,機器學習、人工智慧(AI)和物聯網細分市場都對其感興趣。GCC 仍然是 Linux 系統持續開發的關鍵組件。針對 Intel 架構的 Clear Linux 項目是一個為雲、客戶端和物聯網用例構建的新興發行版,它提供了一個很好的示例,說明如何使用和改進 GCC 編譯器技術來提高基於 Linux 的系統的性能和安全性。GCC 還被用於微軟 Azure Sphere 的應用程序開發,這是一個基於 Linux 的物聯網應用程序操作系統,最初支持基於 ARM 的聯發科 MT3620 處理器。在培養下一代程序員方面,GCC 也是樹莓派的 Windows 工具鏈的核心組件,樹莓派是一種運行基於 Debian 的 GNU/Linux 的低成本嵌入式板,用於促進學校和發展中國家的基礎計算機科學教學。
GCC 由 GNU 項目的創始人 理查德•斯托曼 首次發布 於 1987 年 3 月 22 日,由於它是第一個作為自由軟體發布的可移植的 ANSI C 優化編譯器,因此它被認為是一個重大突破。GCC 由來自世界各地的程序員組成的社區在指導委員會的指導下維護,以確保對項目進行廣泛的、有代表性的監督。GCC 的社區方法是它的優勢之一,它形成了一個由開發人員和用戶組成的龐大而多樣化的社區,他們為項目做出了貢獻並提供支持。根據 Open Hub 的說法,「GCC 是世界上最大的開源團隊之一,在 Open Hub 上的所有項目團隊中排名前 2%。」 [18]
關於 GCC 的許可問題,人們進行了大量的討論,其中大多數是混淆而不是啟發。GCC 在 GNU 通用公共許可證(GPL)版本 3 或更高版本下發布,但運行時庫例外。這是一個左版許可,這意味著衍生作品只能在相同的許可條款下分發。GPLv3 旨在保護 GCC,防止其成為專有軟體,並要求對 GCC 代碼的更改可以自由公開地進行。對於「最終用戶」來說,這個編譯器與其他編譯器完全相同;使用 GCC 對你為自己的代碼所選擇的任何許可都沒有區別。 [19]
- http://clang.llvm.org/features.html#gcccompat ↩︎
- https://opensource.com/article/18/9/happy-birthday-gnu ↩︎
- 由 SUSE 基於最近的構建統計提供的信息。在 openSUSE 中還有其他不生成可執行鏡像的源碼包,這些不包括在統計中。 ↩︎
- https://community.arm.com/tools/b/blog/posts/gnu-toolchain-performance-in-2018 ↩︎
- https://www.arm.com/products/processors/cortex-m ↩︎
- https://gcc.gnu.org/projects/cxx-status.html#cxx17 ↩︎
- https://mysqlserverteam.com/mysql-8-0-source-code-improvements/ ↩︎
- http://httpd.apache.org/docs/2.4/install.html ↩︎
- https://blog.bacula.org/what-is-bacula/system-requirements/ ↩︎
- https://colfaxresearch.com/compiler-comparison/ ↩︎
- https://www.jetbrains.com/research/devecosystem-2018/ ↩︎
- http://releases.llvm.org/6.0.0/tools/clang/docs/UsersManual.html ↩︎
- https://bootlin.com/blog/free-and-ready-to-use-cross-compilation-toolchains/ ↩︎
- https://clang.llvm.org/docs/Toolchain.html ↩︎
- https://www.phoronix.com/scan.php?page=article&item=gcclang-epyc-summer18&num=1 ↩︎
- https://gcc.gnu.org/wiki/ClangDiagnosticsComparison ↩︎
- https://developers.redhat.com/blog/2018/03/15/gcc-8-usability-improvements/ ↩︎
- https://www.openhub.net/p/gcc/factoids#FactoidTeamSizeVeryLarge ↩︎
- https://www.gnu.org/licenses/gcc-exception-3.1-faq.en.html ↩︎
via: https://www.linux.com/blog/2018/10/gcc-optimizing-linux-internet-and-everything
作者:Margaret Lewis 選題:lujun9972 譯者:Chao-zhi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive